import cv2 as cv
import numpy as np

# 注意：确保已安装正确版本的ffmpeg或gstreamer。 若使用Video Capture遇到麻烦，可能原因是错误安装了ffmpeg/gstreamer。

#  如果要捕获视频，首先要做的是创建一个VideoCapture对象，它的参数可以是设备索引或者是视频文件的名称。
#  设备索引就是指设备所对应的设备号，当只连接一个摄像头，参数只需传递0（或-1） 。
#  你可以传递参数1来选择你连接的第二个摄像头等等。
#  接下来，你需要逐帧捕获并显示并不要忘记关闭捕获。
cap = cv.VideoCapture(0, cv.CAP_DSHOW)

while (True):
    # cap.read()返回一个bool值（True / False）。
    # 如果读取帧正确，则它将为True。因此，你可以通过值来确定视频的结尾。
    # 如果初始化摄像头失败，上面的代码会报错。
    # 你可以使用cap.isOpened()来检查是否初始化。如果返回值是True，说明初始化成功，否则就要使用函数 cap.open()。

    # 你还可以使用cap.get(propld)方法访问此视频的某些功能，参数propId代表0到18之间的数字。
    #   每个数字表示视频的一个属性，详细的信息参见：cv::VideoCapture::get().
    #   其中一些值可以使用cap.set(propId，value)进行修改。其中参数value是你想要的新值。
    #   例如，我可以通过cap.get(cv.CAP_PROP_FRAME_WIDTH)和cap.get(cv.CAP_PROP_FRAME_HEIGHT)分别检查帧宽和高度。
    #   它返回给我默认值640x480。但如果我想将其修改为320x240，
    #   只需使用ret=cap.set(cv.CAP_PROP_FRAME_WIDTH，32)和ret = cap.set(cv.CAP_PROP_FRAME_HEIGHT，240)。
    #
    # 注意：如果收到报错信息，请确保其他使用摄像头的程序在正常工作（如Linux中的Cheese）
    ret, frame = cap.read() # ret:是否正常读取到数据；frame:读取到的图像
    gray = cv.cvtColor(frame, cv.COLOR_BGR2GRAY)#图片转灰白
    cv.imshow("frame", gray)
    if cv.waitKey(1) & 0xFF == ord('q'):
        break

cap.release()
cv.destroyAllWindows()
